// https://leetcode.cn/problems/8Zf90G/submissions/497935176/

// 表达式求值的题目大多都使用的是栈
// 这个题目的思路是遍历所有数据，当其不为运算符的时候，将其加入栈中，当遇到运算符的时候，将数据从栈中取出，
// 先取出的数据时运算的num2，后取出的是预算符的开始位,然后再将计算的结果继续放入栈中


function evalRPN(tokens: string[]): number {
    const stack:number[] = [];

    for(const token of tokens) {
        if(token === '+'){
            // 这里如果传入的数据是正确的逆波兰表达式的情况下，num1和num2就一定有值的
            const num2 = stack.pop()!;
            const num1 = stack.pop()!;
            const res = num1 + num2;
            stack.push(res);

        }else if(token === '-'){
            const num2 = stack.pop()!;
            const num1 = stack.pop()!;
            const res = num1 - num2;
            stack.push(res);
        }else if(token === '*'){
            const num2 = stack.pop()!;
            const num1 = stack.pop()!;
            const res = num1 * num2;
            stack.push(res);
        }else if(token === '/'){
            const num2 = stack.pop()!;
            const num1 = stack.pop()!;
            // 这里有负数的时候是向上取整
            const res = Math.trunc( num1 / num2)
            stack.push(res);
        }else{
            // 来到这里的时候肯定是数组类型了，这里防止类型报错，转换为Number类型
            stack.push(Number(token));
        }
    }
    // 
    return stack.pop()!;
}

console.log(evalRPN(["2","1","+","3","*"]))